/**
 * 
 */
package com.autosalon.ui.spravaPojisteni;

import java.util.ArrayList;
import java.util.List;

import com.autosalon.DAO.DaoFactory;
import com.autosalon.model.Poisteni;
import com.autosalon.model.Poistovna;
import com.autosalon.tools.IPaging;
import com.autosalon.tools.PagingComponent;
import com.autosalon.ui.ContentSwitcher;
import com.autosalon.ui.spravaPojisteni.action.BackButtonAction;
import com.autosalon.ui.spravaPojisteni.action.DeletePojisteniAction;
import com.autosalon.ui.spravaPojisteni.action.DeletePojistovnaAction;
import com.autosalon.ui.spravaPojisteni.action.EditPojisteniAction;
import com.autosalon.ui.spravaPojisteni.action.EditPojistovnaAction;
import com.autosalon.ui.spravaPojisteni.action.NewPojisteniAction;
import com.autosalon.ui.spravaPojisteni.action.NewPojistovnaAction;
import com.autosalon.ui.spravaPojisteni.action.SavePojisteniAction;
import com.autosalon.ui.spravaPojisteni.action.SavePojistovnaAction;
import com.autosalon.ui.spravaPojisteni.state.SpravaPojisteniStateHolder;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Button;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Form;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.BaseTheme;

/**
 * @author Ragisel
 * 
 */
public class SpravaPojisteni extends HorizontalLayout implements IPaging {

	private final ContentSwitcher switcher;
	private VerticalLayout contentLayout;
	private VerticalLayout pojistovnaLayout;
	private HorizontalLayout tableLayout;
	private HorizontalLayout buttonLayout;
	private HorizontalLayout pagingLayout;
	private List<Object> listPojisteni;
	private List<Object> listPojistovny;
	private PagingComponent pagingCompPojisteni;
	private PagingComponent pagingCompPojistovny;
	private Button btnBack;
	private Button btnSave;
	private Button btnNewPojisteni;
	private Button btnNewPojistovna;
	private Table tblPojisteni;
	private Table tblPojistovny;
	private Table pojistovny;
	private Form formNewPojisteni;
	private Form formNewPojistovna;
	private TextField tfMesicniSplatka;
	private TextField tfJmeno;
	private TextField tfPopis;
	private PopupDateField popupKonec;
	private PopupDateField popupPocatek;
	private ComboBox cbPojistovna;
	private Poisteni pojisteni;
	private Poistovna pojistovna;
	private int id;
	private Long id_pojisteni;
	private Long id_pojistovny;
	

	public SpravaPojisteni(ContentSwitcher switcher) {
		this.switcher = switcher;
		init();
	}

	private void init() {
		try {
			setId(getSwitcher().getMainWindow().getZakaznik().getRole().getId()
					.intValue());
		} catch (NullPointerException e) {
			setId(1);
		}
		initNewPojisteniForm();
		initNewPojistovnaForm();
		formNewPojisteni.setVisible(false);
		getFormNewPojistovna().setVisible(false);
		contentLayout = new VerticalLayout();
		pojistovnaLayout = new VerticalLayout();
		tableLayout = new HorizontalLayout();
		btnNewPojisteni = new Button("Nové pojištění");
		btnNewPojisteni.addListener(new NewPojisteniAction(this));
		btnNewPojistovna = new Button("Nová pojišťovna");
		btnNewPojistovna.addListener(new NewPojistovnaAction(this));

		pagingCompPojisteni = new PagingComponent(this);
		pagingCompPojistovny = new PagingComponent(this);

		IndexedContainer icPojisteni = new IndexedContainer();
		icPojisteni.addContainerProperty("POJIŠTĚNÍ", String.class, null);
		icPojisteni.addContainerProperty("POČÁTEČNÍ DATUM", String.class, null);
		icPojisteni.addContainerProperty("KONCOVÉ DATUM", String.class, null);
		if (id == 3) {
			icPojisteni.addContainerProperty("UPRAVIT", Button.class, null);
			icPojisteni.addContainerProperty("SMAZAT", Button.class, null);
		}
		tblPojisteni = new Table("Pojištění");
		tblPojisteni.setContainerDataSource(icPojisteni);
		tblPojisteni.setSizeFull();

		IndexedContainer icPojistovny = new IndexedContainer();
		icPojistovny.addContainerProperty("POJIŠŤOVNA", String.class, null);
		if (id == 3) {
			icPojistovny.addContainerProperty("UPRAVIT", Button.class, null);
			icPojistovny.addContainerProperty("SMAZAT", Button.class, null);
		}
		tblPojistovny = new Table("Pojišťovny");
		tblPojistovny.setContainerDataSource(icPojistovny);
		tblPojistovny.setSizeFull();
		naplnTabulkuObjednavky();

		pojistovnaLayout.addComponent(pagingCompPojistovny);
		pojistovnaLayout.addComponent(tblPojistovny);
		pojistovnaLayout.addComponent(btnNewPojistovna);
		pojistovnaLayout.setSpacing(true);
		
		contentLayout.addComponent(pagingCompPojisteni);
		contentLayout.addComponent(tblPojisteni);
		contentLayout.addComponent(btnNewPojisteni);
		contentLayout.setSpacing(true);

		tableLayout.addComponent(contentLayout);
		tableLayout.addComponent(pojistovnaLayout);
		tableLayout.setSpacing(true);
		
		addComponent(tableLayout);
		SpravaPojisteniStateHolder.setState(
				SpravaPojisteniStateHolder.VIEW_POJISTENI_STATE, getId(), this);
	}

	@Override
	public void naplnTabulkuObjednavky() {
		listPojisteni = new ArrayList<Object>();
		tblPojisteni.removeAllItems();
		listPojisteni = DaoFactory
				.getinstance()
				.getPoisteni()
				.getAll(pagingCompPojisteni.getFrom(),
						pagingCompPojisteni.getTo());
		for (Object o : listPojisteni) {
			pojisteni = (Poisteni) o;

			if (id == 3) {
				Button btnEditPujcka;
				btnEditPujcka = new Button("Editovat");
				btnEditPujcka.setStyleName(BaseTheme.BUTTON_LINK);
				btnEditPujcka.addListener(new EditPojisteniAction(this));
				btnEditPujcka.setData(pojisteni.getId());

				Button btnDelPujcka;
				btnDelPujcka = new Button("Smazat");
				btnDelPujcka.addListener(new DeletePojisteniAction(this));
				btnDelPujcka.setStyleName(BaseTheme.BUTTON_LINK);
				btnDelPujcka.setData(pojisteni.getId());

				tblPojisteni.addItem(
						new Object[] {
								pojisteni.getPoistovna().getNazevPoistovny(),
								pojisteni.getPocDatum(),
								pojisteni.getKonDatum(), btnEditPujcka,
								btnDelPujcka }, null);
			} else
				tblPojisteni.addItem(
						new Object[] {
								pojisteni.getPoistovna().getNazevPoistovny(),
								pojisteni.getPocDatum(),
								pojisteni.getKonDatum() }, null);
		}
		listPojistovny = new ArrayList<Object>();
		tblPojistovny.removeAllItems();
		listPojistovny = DaoFactory
				.getinstance()
				.getPoistovna()
				.getAll(pagingCompPojistovny.getFrom(),
						pagingCompPojistovny.getTo());
		for (Object o : listPojistovny) {
			pojistovna = (Poistovna) o;

			if (id == 3) {
				Button btnEditPujcka;
				btnEditPujcka = new Button("Editovat");
				btnEditPujcka.setStyleName(BaseTheme.BUTTON_LINK);
				btnEditPujcka.addListener(new EditPojistovnaAction(this));
				btnEditPujcka.setData(pojistovna.getId());

				Button btnDelPujcka;
				btnDelPujcka = new Button("Smazat");
				btnDelPujcka.addListener(new DeletePojistovnaAction(this));
				btnDelPujcka.setStyleName(BaseTheme.BUTTON_LINK);
				btnDelPujcka.setData(pojistovna.getId());

				tblPojistovny.addItem(
						new Object[] { pojistovna.getNazevPoistovny(),
								btnEditPujcka, btnDelPujcka }, null);
			} else
				tblPojistovny.addItem(
						new Object[] { pojistovna.getNazevPoistovny() }, null);
		}

	}

	public void initNewPojisteniForm() {
		btnBack = new Button("Zpet");
		btnBack.addListener(new BackButtonAction(this));

		btnSave = new Button("Uložit");
		btnSave.addListener(new SavePojisteniAction(this));

		cbPojistovna = new ComboBox("Nové pojištění: ");
		popupKonec = new PopupDateField("Koncové datum: ");
		popupPocatek = new PopupDateField("Počáteční datum: ");
		naplnComboboxy();
		formNewPojisteni = new Form();
		formNewPojisteni.setCaption("Nové pojištění: ");
		formNewPojisteni.getLayout().addComponent(cbPojistovna);
		formNewPojisteni.getLayout().addComponent(popupPocatek);
		formNewPojisteni.getLayout().addComponent(popupKonec);
		formNewPojisteni.getLayout().addComponent(btnBack);
		formNewPojisteni.getLayout().addComponent(btnSave);

		addComponent(formNewPojisteni);
	}
	
	public void initNewPojistovnaForm() {
		btnBack = new Button("Zpět");
		btnBack.addListener(new BackButtonAction(this));

		btnSave = new Button("Uložit");
		btnSave.addListener(new SavePojistovnaAction(this));
		
		tfJmeno = new TextField("Jméno: ");
		tfPopis = new TextField("Popis: ");

		setFormNewPojistovna(new Form());
		getFormNewPojistovna().setCaption("Nová pojišťovna: ");
		getFormNewPojistovna().getLayout().addComponent(tfJmeno);
		getFormNewPojistovna().getLayout().addComponent(tfPopis);
		getFormNewPojistovna().getLayout().addComponent(btnBack);
		getFormNewPojistovna().getLayout().addComponent(btnSave);

		addComponent(getFormNewPojistovna());
	}

	private void naplnComboboxy() {
		cbPojistovna.removeAllItems();
		for (Object o : DaoFactory.getinstance().getPoistovna().getAll(0, Integer.MAX_VALUE)){
			Poistovna p = (Poistovna)o;
			cbPojistovna.addItem(p.getNazevPoistovny().toString());
		}

	}

	public VerticalLayout getContentLayout() {
		return contentLayout;
	}

	public void setContentLayout(VerticalLayout contentLayout) {
		this.contentLayout = contentLayout;
	}

	public HorizontalLayout getButtonLayout() {
		return buttonLayout;
	}

	public void setButtonLayout(HorizontalLayout buttonLayout) {
		this.buttonLayout = buttonLayout;
	}

	public List<Object> getListPojisteni() {
		return listPojisteni;
	}

	public void setListPojisteni(List<Object> listPojisteni) {
		this.listPojisteni = listPojisteni;
	}

	public List<Object> getListPojistovny() {
		return listPojistovny;
	}

	public void setListPojistovny(List<Object> listPojistovny) {
		this.listPojistovny = listPojistovny;
	}

	public PagingComponent getPagingCompPojisteni() {
		return pagingCompPojisteni;
	}

	public void setPagingCompPojisteni(PagingComponent pagingCompPojisteni) {
		this.pagingCompPojisteni = pagingCompPojisteni;
	}

	public Button getBtnBack() {
		return btnBack;
	}

	public void setBtnBack(Button btnBack) {
		this.btnBack = btnBack;
	}

	public Button getBtnSave() {
		return btnSave;
	}

	public void setBtnSave(Button btnSave) {
		this.btnSave = btnSave;
	}

	public Button getBtnNewPojisteni() {
		return btnNewPojisteni;
	}

	public void setBtnNewPojisteni(Button btnNewPojisteni) {
		this.btnNewPojisteni = btnNewPojisteni;
	}

	public Table getTblPojisteni() {
		return tblPojisteni;
	}

	public void setTblPojisteni(Table tblPojisteni) {
		this.tblPojisteni = tblPojisteni;
	}

	public Table getPojistovny() {
		return pojistovny;
	}

	public void setPojistovny(Table pojistovny) {
		this.pojistovny = pojistovny;
	}

	public Form getFormNewPojisteni() {
		return formNewPojisteni;
	}

	public void setFormNewPojisteni(Form formNewPojisteni) {
		this.formNewPojisteni = formNewPojisteni;
	}

	public TextField getTfMesicniSplatka() {
		return tfMesicniSplatka;
	}

	public void setTfMesicniSplatka(TextField tfMesicniSplatka) {
		this.tfMesicniSplatka = tfMesicniSplatka;
	}

	public PopupDateField getPopupKonec() {
		return popupKonec;
	}

	public void setPopupKonec(PopupDateField popupKonec) {
		this.popupKonec = popupKonec;
	}

	public PopupDateField getPopupPocatek() {
		return popupPocatek;
	}

	public void setPopupPocatek(PopupDateField popupPocatek) {
		this.popupPocatek = popupPocatek;
	}

	public ComboBox getCbPojistovna() {
		return cbPojistovna;
	}

	public void setCbPojistovna(ComboBox cbPojistovna) {
		this.cbPojistovna = cbPojistovna;
	}

	public Poisteni getPojisteni() {
		return pojisteni;
	}

	public void setPojisteni(Poisteni pojisteni) {
		this.pojisteni = pojisteni;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public Long getId_pojisteni() {
		return id_pojisteni;
	}

	public void setId_pojisteni(Long id_pojisteni) {
		this.id_pojisteni = id_pojisteni;
	}

	public ContentSwitcher getSwitcher() {
		return switcher;
	}

	public HorizontalLayout getTableLayout() {
		return tableLayout;
	}

	public void setTableLayout(HorizontalLayout tableLayout) {
		this.tableLayout = tableLayout;
	}

	public Button getBtnNewPojistovna() {
		return btnNewPojistovna;
	}

	public void setBtnNewPojistovna(Button btnNewPojistovna) {
		this.btnNewPojistovna = btnNewPojistovna;
	}

	public PagingComponent getPagingCompPojistovny() {
		return pagingCompPojistovny;
	}

	public void setPagingCompPojistovny(PagingComponent pagingCompPojistovny) {
		this.pagingCompPojistovny = pagingCompPojistovny;
	}

	public Table getTblPojistovny() {
		return tblPojistovny;
	}

	public void setTblPojistovny(Table tblPojistovny) {
		this.tblPojistovny = tblPojistovny;
	}

	public HorizontalLayout getPagingLayout() {
		return pagingLayout;
	}

	public void setPagingLayout(HorizontalLayout pagingLayout) {
		this.pagingLayout = pagingLayout;
	}

	public VerticalLayout getPojistovnaLayout() {
		return pojistovnaLayout;
	}

	public void setPojistovnaLayout(VerticalLayout pojistovnaLayout) {
		this.pojistovnaLayout = pojistovnaLayout;
	}

	public TextField getTfJmeno() {
		return tfJmeno;
	}

	public void setTfJmeno(TextField tfJmeno) {
		this.tfJmeno = tfJmeno;
	}

	public TextField getTfPopis() {
		return tfPopis;
	}

	public void setTfPopis(TextField tfPopis) {
		this.tfPopis = tfPopis;
	}

	public Form getFormNewPojistovna() {
		return formNewPojistovna;
	}

	public void setFormNewPojistovna(Form formNewPojistovna) {
		this.formNewPojistovna = formNewPojistovna;
	}

	public Long getId_pojistovny() {
		return id_pojistovny;
	}

	public void setId_pojistovny(Long id_pojistovny) {
		this.id_pojistovny = id_pojistovny;
	}

}
